﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using RESTVeterinariaServices.Dominio;
using RESTVeterinariaServices.Persistencia;
using System.Data.SqlClient;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Net;

namespace RESTVeterinariaServices
{
    public class CitaService : ICitaService
    {
        private CitaDAO dao = new CitaDAO();
        
        public Cita CrearCita(Cita CitaACrear)
        {
            int existe = 0;
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                string query = "SELECT datediff(DAY,GETDATE(),@fechacita)";
                using (SqlCommand valida = new SqlCommand(query, con))
                {
                    valida.Parameters.Add(new SqlParameter("@FechaCita", CitaACrear.FechaCita));
                    existe = (int)valida.ExecuteScalar();
                }
            }
            if (existe < 0)
            {
                throw new WebFaultException<MensajeRetornoWS>(
                    new MensajeRetornoWS()
                    {
                        IsValid = false,
                        txtMensaje = "La fecha de la cita debe ser mayor o igual a la fecha actual",
                        PkReference = 0
                    },
                        HttpStatusCode.InternalServerError);
            } 



            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                string query = "SELECT COUNT(*) FROM Cita WHERE FechaCita= DATEADD(HOUR,-5,@fechacita) AND IdVeterinario = @IdVeterinario";
                using (SqlCommand valida = new SqlCommand(query, con))
                {
                    valida.Parameters.Add(new SqlParameter("@FechaCita", CitaACrear.FechaCita));
                    valida.Parameters.Add(new SqlParameter("@IdVeterinario", CitaACrear.Veterinario.IdVeterinario));
                    existe = (int)valida.ExecuteScalar();
                }
            }
            if (existe > 0){
                throw new WebFaultException<MensajeRetornoWS>(
                    new MensajeRetornoWS(){
                        IsValid=false,
                        txtMensaje="El veterinario y la hora de cita seleccionada no esta disponible",
                        PkReference=0},
                        HttpStatusCode.InternalServerError);
            }

            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                string query = "SELECT COUNT(*) FROM CITA WHERE CONVERT(CHAR(10),FechaCita,103)= CONVERT(CHAR(10),@FechaCita,103) AND IdPaciente=@IdPaciente";
                using (SqlCommand valida = new SqlCommand(query, con))
                {
                    valida.Parameters.Add(new SqlParameter("@FechaCita", CitaACrear.FechaCita));
                    valida.Parameters.Add(new SqlParameter("@IdPaciente", CitaACrear.Paciente.IdPaciente));
                    existe = (int)valida.ExecuteScalar();
                }
            }
            if (existe > 0)
            {
                throw new WebFaultException<MensajeRetornoWS>(
                    new MensajeRetornoWS()
                    {
                        IsValid = false,
                        txtMensaje = "No puede haber mas de una cita por paciente en un mismo dia",
                        PkReference = 0
                    },
                        HttpStatusCode.InternalServerError);
            }


            return dao.Crear(CitaACrear);
        }

        public Cita ObtenerCita(string IdCita)
        {
            return dao.obtener(IdCita);
        }

        public List<Cita> ListarTodos()
        {
            return dao.ListarTodos();
        }

        public Cita ModificarCita(Cita CitaAModificar)
        {
            int existe = 0;
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                string query = "SELECT COUNT(*) FROM dbo.Cita WHERE FechaCita=DATEADD(HOUR,-5,@fechacita) AND IdVeterinario = @IdVeterinario AND idCita<>@IdCita";
                using (SqlCommand valida = new SqlCommand(query, con))
                {
                    valida.Parameters.Add(new SqlParameter("@IdVeterinario", CitaAModificar.Veterinario.IdVeterinario));
                    valida.Parameters.Add(new SqlParameter("@FechaCita", CitaAModificar.FechaCita));
                    valida.Parameters.Add(new SqlParameter("@IdCita", CitaAModificar.IdCita));
                    existe = (int)valida.ExecuteScalar();
                }
            }
            if (existe > 0)
            {
                throw new WebFaultException<MensajeRetornoWS>(
                    new MensajeRetornoWS()
                    {
                        IsValid = false,
                        txtMensaje = "El veterinario y la hora de cita seleccionada no esta disponible",
                        PkReference = 0
                    },
                        HttpStatusCode.InternalServerError);
            }            
            return dao.Modificar(CitaAModificar);
        }

        public void EliminarCita(string IdCita)
        {
            int EstadoConfirmado = 0;
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                string query = "SELECT IdEstado FROM Cita WHERE idCita=@IdCita";
                using (SqlCommand valida = new SqlCommand(query, con))
                {
                    valida.Parameters.Add(new SqlParameter("@IdCita", IdCita));
                    EstadoConfirmado = (int)valida.ExecuteScalar();
                }
            }
            if (EstadoConfirmado == 2)
            {
                throw new WebFaultException<MensajeRetornoWS>(
                    new MensajeRetornoWS()
                    {
                        IsValid = false,
                        txtMensaje = "NO puede cancelar una CITA ya CONFIRMADA",
                        PkReference = 0
                    },
                        HttpStatusCode.InternalServerError);
            }
            dao.Eliminar(IdCita);
        }
    }
}
